package shujia.day18.tcpdemo4;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/*
    tcp协议下，客户端代码编写：
        1:建立客户端的Socket服务,并明确要连接的服务器。
        2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
        3:通过Socket对象的方法,可以获取这两个流
        4:通过流的对象可以对数据进行传输
        5:如果传输数据完毕,关闭资源


    tcp协议中，客户端不能先启动，要先启动服务器端，让服务器端绑定一个端口号，然后再让客户端做连接。


    客户端的一个文件：F:\hmbb.jpg


    服务器的存储路径：F:\\users\{ip}\{时间戳}\hmbb.jpg

 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        //创建客户端Socket对象，需要指定连接的服务器地址和端口号
        //Socket(String host, int port)
        //创建流套接字并将其连接到指定主机上的指定端口号
        Socket socket = new Socket("192.168.1.20", 12345);
        File file = new File("F:\\hmbb.jpg");

        //创建字节缓冲输入流对象，读取本地文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));


        //获取通道中的输入流对象
        //返回值类型是InputStream，本质上是字节输入流
        InputStream is = socket.getInputStream();

        //获取通道中的输出流对象
        //返回值类型是OutputStream，本质上是字节输出流
        OutputStream os = socket.getOutputStream();
        //图片是字节构成的，图片应该使用字节输出流
        //使用字节缓冲输出流进行包装
        BufferedOutputStream bos = new BufferedOutputStream(os);

        DataOutputStream dos = new DataOutputStream(os);
        dos.writeUTF(file.getName()); // 发送文件名
        //使用DataOutputStream流向服务器写一个值的时候，一定要记得刷
        dos.flush();


        //使用字节流缓冲流一次读写一个字节数组，完成图片的读写
        //将本地磁盘中的图片 -> 通道中去
        byte[] bytes1 = new byte[1024];
        int length1 = 0;
        while ((length1 = bis.read(bytes1)) != -1) {
            bos.write(bytes1, 0, length1);
            bos.flush();
        }


        //通知服务器端，关闭输出流，数据传输完毕！
        socket.shutdownOutput();

        byte[] bytes2 = new byte[1024];
        int length2 = is.read(bytes2);
        String res = new String(bytes2, 0, length2);
        System.out.println("服务器反馈：" + res);
        System.out.println();


        is.close();
        bos.close();
        bis.close();
        //如果传输数据完毕,关闭资源
        socket.close();
    }
}
